import axios from "axios";
import { getLocalUserStatus } from "./userStatus";

/**
 * 1.根域名配置
 * 2.超时时间
 * 3.请求拦截器/响应拦截器
 */

const request = axios.create({
    baseURL:'http://localhost:8080/api',
    timeout:50*1000,
    retry: 1, //设置全局重试请求次数（最多重试几次请求）
    retryDelay: 5000, //设置全局请求间隔
    withCredentials:true,
    maxContentLength:Infinity,
    maxBodyLength:Infinity
})

let oldTime = Date.now();
// 添加请求拦截器
request.interceptors.request.use(function (config) {
    const curTime = Date.now();
    if(curTime - oldTime <= config.retryDelay) return Promise.reject(new Error("Throttled! Try again later."));

    oldTime = curTime;
    // 在发送请求之前做些什么
    const userStatus = getLocalUserStatus();
    if(userStatus.token) config.headers.Authorization = "Bearer " + userStatus.token;

    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    const config = error.config;

    if(!config || !config.retry) return Promise.reject(error);

    config._retryCount = config._retryCount || 0;

    if(config._retryCount >= config.retry) return Promise.reject(error);

    config._retryCount++;

    return new Promise((resolve) => {
      setTimeout(()=>{
        resolve();
      },config.retryDelay);
    }).then(()=>{
      return request(config);
    })
  });

export {request};